Wang Haihua
🍈 🍉🍊 🍋 🍌
层次分析法(AHP)方法的代码实现:
def ahp(judge_matrix):
""" 计算AHP模型
Parameters :
----------
judge_matrix : 两两判断矩阵
Yields:
-------
ahp_weights : 权重
"""
judge_matrix = np.array(judge_matrix, dtype=np.float64) # 将数据转换为numpy array格式便于后续计算
n = judge_matrix.shape[0] # 确定矩阵维度
eigenvalues, eigenvectors = np.linalg.eig(judge_matrix) # 求特征值与特征向量
value_max = eigenvalues.max() # 求最大特征值
value_max_index = eigenvalues.argmax() # 最大特征值索引,用于提取最大特征值所对应的特征向量
CI = (value_max-n)/(n-1) # 计算一致性指数CI
RI_list = [0,0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49] # RI列表
if CI/RI_list[n]>0.1: # 判断不一致性
return 'Judgement Matrix is NOT consistent'
else:
print('The Max Eigenvalue is ',value_max)
ahp_weights = eigenvectors[:,value_max_index]
ahp_weights = ahp_weights/ahp_weights.sum() # 权重归一化
return ahp_weights # 返回权重值
给定一个两两对比矩阵: $$\left[\begin{matrix}1 & 2 & 3\\0.5 & 1 & 5\\0.33 & 0.2 & 1\end{matrix}\right]$$
测试代码:
weights = ahp(np.array([[1,2,3],[1/2,1,9],[1/3,1/9,1]]))
结果为:'Judgement Matrix is NOT consistent'
数据不一致
接下来我们调整判断矩阵: $$\left[\begin{matrix}1 & 2 & 3\\0.5 & 1 & 1\\0.33 & 1 & 1\end{matrix}\right]$$
weights = ahp(np.array([[1,2,3],[1/2,1,1],[1/3,1,1]]))
结果可接受,最大特征值为:
The Max Eigenvalue is (3.0182947072896287+0j)
权重为:
array([0.54994561+0.j, 0.24021087+0.j, 0.20984352+0.j])
import numpy as np
def ahp(judge_matrix):
""" 计算AHP模型
Parameters :
----------
judge_matrix : 两两判断矩阵
Yields:
-------
ahp_weights : 权重
"""
judge_matrix = np.array(judge_matrix, dtype=np.float64) # 将数据转换为numpy array格式便于后续计算
n = judge_matrix.shape[0] # 确定矩阵维度
eigenvalues, eigenvectors = np.linalg.eig(judge_matrix) # 求特征值与特征向量
value_max = eigenvalues.max() # 求最大特征值
value_max_index = eigenvalues.argmax() # 最大特征值索引,用于提取最大特征值所对应的特征向量
CI = (value_max-n)/(n-1) # 计算一致性指数CI
RI_list = [0,0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49] # RI列表
if CI/RI_list[n]>0.1: # 判断不一致性
return 'Judgement Matrix is NOT consistent'
else:
print('The Max Eigenvalue is ',value_max)
ahp_weights = eigenvectors[:,value_max_index]
ahp_weights = ahp_weights/ahp_weights.sum() # 权重归一化
return ahp_weights # 返回权重值
weights = ahp(np.array([[1,2,3],[1/2,1,9],[1/3,1/9,1]]))
weights
'Judgement Matrix is NOT consistent'
weights = ahp(np.array([[1,2,3],[1/2,1,1],[1/3,1,1]]))
The Max Eigenvalue is (3.0182947072896287+0j)
weights
array([0.54994561+0.j, 0.24021087+0.j, 0.20984352+0.j])